package com.jihu.mall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * Spring-Cache的不足
 *  1.读模式
 *      缓存穿透：查询一个null数据，解决：缓存空数据 cache-null-values: true
 *      缓存击穿：大量并发进来同时查询一个正好过期的数据 解决：加锁 sync=true 加锁 解决缓存击穿
 *      缓存雪崩：大量key同时过期 解决：加随机时间  time-to-live: 3600000
 *  2.写模式： 缓存与数控一致
 *      a.读写加锁
 *      b.引入Canal 感知到mysql的更新去更新数据
 *      c.读多写多，直接去数据库查询就行
 *  总结：
 *      常规数据（读多写少，及时性，一致性要求不高的数据 完全可以使用Spring-Cache 写模式（只要缓存的数据有过期时间就足够了））
 *
 *      特殊数据 特殊设计
 *  原理：
 *      CacheManager()->Cache(RedisCache)->Cache负责缓存的读写
 */
@EnableCaching
@EnableTransactionManagement
@EnableFeignClients("com.jihu.mall.product.feign")
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan("com.jihu.mall.product.dao")
public class MallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(MallProductApplication.class, args);
    }

}
